package org.sanguine.tests.protei.springapp.mvc.dao;

import org.sanguine.tests.protei.springapp.mvc.models.Entity;


import java.io.Serializable;


/**
 * Created by alex on 27.02.14.
 * Author: Alex Kuznetsov
 */

/**
 * Bean для работы со схемой используемой базы данных/создания запросов
 */
public interface SchemaBean extends Serializable {
    /**
     * Получить выражение на языке запросов целевой базы данных для создания нового
     * хранилища под хранение установленного c помощью @setEntityClass класса-элемента
     * @return - DDL выражение
     */
    public String getDDLExpression();

    /**
     * Получить выражение на языке запросов целевой базы данных
     * для сохранения нового элемента/обновления существующего
     * @param entity - объект-элемент для сохранения/обновления
     * @param update - флаг операции: true - операция обновления, false - сохранение нового
     * @return - выражение на языке запросов целевой базы данных
     */

    public String getColumnsClause(Entity entity, boolean update);

    /**
     * Настройить bean на работу с элементом класса clazz
     * @param clazz - класс требуемого элемента хранилища
     */

    public void setEntityClass(Class<? extends Entity> clazz);

    /**
     * Настройить bean на работу с базой данных с именем databaseName
     * @param databaseName - имя базы данных
     */

    public void setDatabaseName(String databaseName);

    /**
     * Получить идентификатор поля первичного ключа в целевой базе данных
     * @return - идентификатор первичного ключа
     */
    public String getKeyName();

    /**
     * Создать новый элемент на основании ответа их целевой базы данных, содержащем
     * ранее сохраненное в базе данных состояние элемента
     * @param resultSet - ответ целевой базы данных
     * @return - новый элемент или null, если создать элемент не удалось
     */

    public Object createEntityInstance(Object resultSet);

    /**
     * Преобразовать идентификатор элемента в объект-первичный ключ в целевой базе данных
     * @param key - идентификатор элекмента
     * @return - объект-ключ или null если преобразование невозможно
     */

    public Object getNativeKeyValue(String key);

    /**
     * Преобразовать объект-первичный ключ целевой базы данных в идентификатор элемента
     * @param key - объект-ключ
     * @return - идентификатор элемента или null если преобразование невозможно
     */

    public String nativeKeyToString(Object key);
}
